﻿using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;


namespace Studio7i.Persistencia
{
    public class ReservaServicioDAO
    {

        // Métodos CRUD
        public ReservaServicio Crear(ReservaServicio reservaServicioAcrear)
        {
            string _Sentencia = "INSERT INTO ReservaServicio(Codigo,CodReserva,CodServ) VALUES(@Codigo,@CodReserva,@CodServ)";
            int _NuevoCodigo = GenerarNuevoCodigo();

            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@Codigo", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@CodReserva", reservaServicioAcrear.CodReserva));
                    _Comando.Parameters.Add(new SqlParameter("@CodServ", reservaServicioAcrear.CodServicio));

                    _Comando.ExecuteNonQuery();
                }
            }

            return Obtener(_NuevoCodigo);//Deberia devolver una lista de creados
            //return reservaServicioAcrear;

        }

        public ReservaServicio Obtener(int codigo)
        {
            string _Sentencia = "SELECT Codigo,CodReserva,CodServ FROM ReservaServicio WHERE Codigo=@codigo";
            ReservaServicio reservaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            reservaEncontrada = new ReservaServicio();
                            reservaEncontrada.Codigo = _Resultado.GetInt32(0);
                            reservaEncontrada.CodReserva = _Resultado.GetInt32(1);
                            reservaEncontrada.CodServicio = _Resultado.GetInt32(2);

                        }
                    }
                }
            }
            return reservaEncontrada;
        }

        public ReservaServicio Modificar(ReservaServicio reservaServicioAModificar)
        {
            string _Sentencia = "UPDATE ReservaServicio SET CodReserva=@CodReserva,CodServ=@CodServ FROM ReservaServicio  WHERE WHERE Codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaServicioAModificar.Codigo));
                    _Comando.Parameters.Add(new SqlParameter("@CodReserva", reservaServicioAModificar.CodReserva));
                    _Comando.Parameters.Add(new SqlParameter("@CodServ", reservaServicioAModificar.CodServicio));


                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(reservaServicioAModificar.Codigo); 
            //return reservaServicioAModificar;
        }

        public void Eliminar(ReservaServicio reservaServicioAEliminar)
        {
            
            string _Sentencia = "Delete ReservaServicio where Codigo=@codigo";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reservaServicioAEliminar.Codigo));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<ReservaServicio> ListarTodos()
        {
            string _Sentencia = "SELECT Codigo,CodReserva,CodServ FROM ReservaServicio";
            ICollection<ReservaServicio> reservasEncontradas = new List<ReservaServicio>();
            ReservaServicio reservaEncontrada = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            reservaEncontrada = new ReservaServicio();

                            if (DBNull.Value.Equals(_Resultado["Codigo"])) // No hay datos en la tabla
                                reservaEncontrada.Codigo = 0;
                            else
                                reservaEncontrada.Codigo = (int)_Resultado["Codigo"];
                            if (DBNull.Value.Equals(_Resultado["CodReserva"])) // No hay datos en la tabla
                                reservaEncontrada.CodReserva = 0;
                            else
                                reservaEncontrada.CodReserva = (int)_Resultado["CodReserva"];

                            if (DBNull.Value.Equals(_Resultado["CodServ"])) // No hay datos en la tabla
                                reservaEncontrada.CodServicio = 0;
                            else
                                reservaEncontrada.CodServicio = (int)_Resultado["CodServ"];

                            reservasEncontradas.Add(reservaEncontrada);
                        }
                    }
                }
            }
            return reservasEncontradas;
        }

        public ICollection<ReservaServicio> ListarServicioxReserva(Reserva reserva)
        {
            string _Sentencia = "SELECT CodServ FROM ReservaServicio WHERE CodReserva=@codigo";
            ICollection<ReservaServicio> instrumentosEncontrados = new List<ReservaServicio>();
            ReservaServicio instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@codigo", reserva.CodReserva));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new ReservaServicio();
                            instrumentoEncontrado.CodReserva = reserva.CodReserva;
                            if (DBNull.Value.Equals(_Resultado["CodServ"])) // No hay datos en la tabla
                                instrumentoEncontrado.CodServicio = 0;
                            else
                                instrumentoEncontrado.CodServicio = (int)_Resultado["CodServ"];

                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }

        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(Codigo) FROM ReservaServicio";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}